🤖SQL Serverのwhere句でsysdatetime()を使って前日1日のbetweenを求めるには?もしくはまったく異なる良いやり方があるか?
table:sample_table
LogDate ...
2024-11-17 12:00.00.999 ...
2024-11-18 12:00.00.999 ...
2024-11-19 12:00.00.999 ...
条件
sysdatetime()実行: 2024-11-19 15:00:00.000
求めたい日付の区間: 2024-11-18 00:00:00.000から2024-11-18 23:59.59.999
table:result
LogDate ...
2024-11-18 12:00.00.999 ...
gosyujin_ChatGPT.icon:
SQL ServerでSYSDATETIME()を使用して前日1日のデータを取得するには、WHERE句でBETWEENを使う方法があります。以下のようにクエリを記述します。
code:sql
SELECT *
FROM sample_table
WHERE LogDate BETWEEN
CAST(CONVERT(date, SYSDATETIME() - 1) AS datetime) AND
DATEADD(millisecond, -3, CAST(CONVERT(date, SYSDATETIME()) AS datetime));
このクエリでは、SYSDATETIME()から1日を引いた日付を基に前日の開始時刻(00:00:00.000)を求め、SYSDATETIME()の日付部分を使って前日の終了時刻(23:59:59.999)を求めています。DATEADD(millisecond, -3, ...)を使って、1日後の開始時刻から3ミリ秒引くことで、前日の23:59:59.999を取得しています。これにより、2024-11-18の1日分のデータを取得できます。
なぜ-3ミリ秒?
gosyujin_ChatGPT.icon:
SQL Serverでは、datetime型の精度が3.33ミリ秒であるため、23:59:59.999を正確に表現することができません。実際には23:59:59.997が最大の時間となります。したがって、1日後の開始時刻から3ミリ秒を引くことで、前日の23:59:59.997を求めることができます。この調整により、datetime型の精度制限を考慮した正確な時間範囲を指定できます。
以下の部分で「オペランド型の不整合: datetime2 は int と互換性がありません」エラーとなる
code:sql
CAST(CONVERT(date, SYSDATETIME() - 1) AS datetime)
gosyujin_ChatGPT.icon:
エラーの原因は、SYSDATETIME()がdatetime2型を返すため、直接数値を引くことができないことにあります。この場合、日付の計算を行うにはDATEADD関数を使用するのが適切です。以下のように修正できます。
code:sql
SELECT *
FROM sample_table
WHERE LogDate BETWEEN
CAST(CONVERT(date, DATEADD(DAY, -1, SYSDATETIME())) AS datetime) AND
DATEADD(millisecond, -3, CAST(CONVERT(date, SYSDATETIME()) AS datetime));
ここでは、DATEADD(DAY, -1, SYSDATETIME())を使って、SYSDATETIME()から1日を引いています。これにより、datetime2型からintを直接引くことなく前日の日付を取得できます。